
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>死信队列概念与处理 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>死信队列概念与处理 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">在RocketMQ中，什么是死信队列（Dead Letter Queue）？它的主要作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">死信队列（DLQ）是RocketMQ中的一种特殊队列，主要作用是存储无法被正常消费的消息。当消息在消费过程中出现异常，并且在重试多次后仍然失败，这些消息就会被转移到死信队列中。</div>
          </div>
          <div class="card-source">来源: 死信队列的概念和形成原因</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">请列举导致消息进入RocketMQ死信队列的四个主要原因。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 消费失败超过最大重试次数（默认为16次）；2. 消息过期（如果设置了TTL）；3. 消息被消费者拒绝且设置为不重新入队；4. 队列达到最大长度，导致新消息被转发。</div>
          </div>
          <div class="card-source">来源: 形成原因</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">RocketMQ中死信队列的命名规则是怎样的？如果一个消费者组名为“MyConsumerGroup”，其对应的死信队列名称是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">死信队列的命名规则是 `%DLQ%+{原ConsumerGroup}`。例如，如果消费者组名为 `MyConsumerGroup`，则对应的死信队列名称为 `%DLQ%MyConsumerGroup`。</div>
          </div>
          <div class="card-source">来源: 死信队列的命名规则</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">当一条消息成为死信消息后，它的属性会发生什么变化？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">死信消息会保留原始消息的所有属性，如消息ID、生产者信息、原始Topic等。此外，RocketMQ还会为其添加一些额外的属性，例如重试次数和最后一次消费失败的时间戳。</div>
          </div>
          <div class="card-source">来源: 死信消息的存储</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">进入死信队列的消息会自动进行重试吗？如果不能，有哪些人工干预的方法？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">进入死信队列的消息不会自动重试，需要进行人工干预。干预方法包括：1. 通过RocketMQ的工具或API将消息手动恢复并重新发送到原始Topic；2. 设置专门的消费者来消费死信队列中的消息，并根据业务逻辑进行处理。</div>
          </div>
          <div class="card-source">来源: 死信消息的重试机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">为了有效管理死信队列，文档推荐了哪些监控策略？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">推荐的监控策略包括：1. 为死信队列设置消息数量的告警阈值；2. 定期检查死信队列中的消息；3. 结合消费者的日志分析失败原因；4. 使用RocketMQ Dashboard进行可视化监控。</div>
          </div>
          <div class="card-source">来源: 监控策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在处理死信队列中的消息时，为什么“分类处理”是一种最佳实践？请举例说明。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为不同失败原因的消息需要采取不同的处理策略。例如：对于因临时故障导致的失败，可以在修复后重新发送；对于数据格式错误，可以修正数据后重发；对于业务逻辑错误，则可能需要修改业务代码。</div>
          </div>
          <div class="card-source">来源: 处理最佳实践</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">如何将死信队列中的消息重新进行消费？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以使用RocketMQ提供的消息重放功能，将死信消息重新发送到原始Topic中。这通常作为一种手动恢复或自动化处理的手段。</div>
          </div>
          <div class="card-source">来源: 处理最佳实践</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">除了对已产生的死信消息进行处理外，有哪些最佳实践可以从源头上预防或减少消息进入死信队列？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">预防性的最佳实践包括：1. 优化消费者的业务逻辑；2. 为不同类型的消息设置合理的重试次数和间隔；3. 在消息生产阶段增加数据格式和业务规则的前置检查，以减少无效消息的产生。</div>
          </div>
          <div class="card-source">来源: 处理最佳实践</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
